package rubix.control
{
	import com.adobe.scenegraph.SceneNode;
	import flash.events.MouseEvent;
	import rubix.data.Sides;
	
	import flash.display.DisplayObjectContainer;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	
	import rubix.data.RubixModel;
	import rubix.events.CubeEvent;
	import rubix.view.RubixView;
	
	public class Rubix
	{
		protected var _view:RubixView;
		protected var _model:RubixModel;
		protected var _host:SceneNode;
		
		private var _history:Vector.<Array>=new Vector.<Array>();
		private var _playBack:Boolean;
		private var _totalUndo:Boolean;
		
		public function Rubix(host:SceneNode)
		{
			_host=host;
			_model=new RubixModel();
			_view=new RubixView(_model.cubes);
			_host.addChild(_view);
			// передаем события напряму, т.к. контролеру нечего ловить
			_model.addEventListener(CubeEvent.CUBE_ROTATED,_view.modelEventsHandler);
			_model.addEventListener(CubeEvent.CUBE_HIGHLIGHTED,_view.modelEventsHandler);
			_model.addEventListener(CubeEvent.CUBE_UNHIGHLIGHTED,_view.modelEventsHandler);
		}
	
		// Метод для подсветки грани куба
		public function highlightSide(orientation:Array):void{
			_model.highlightSide(orientation);
		}
		// Случайный ход
		public function randomMove():void{
			rotate(Sides.data[Math.floor(Math.random()*6)].orientation,(Math.random()>0.5)?90:-90);
		}
		// Вращение грани
		public function rotate(orientation:Array,degrees:Number=90):void{
			// Записываем ход в историю
			if(!_playBack){
				// Остановить глобальную отмену при ходе игрока
				if(_totalUndo) _totalUndo=false;
				_history.push(orientation.concat(degrees));
			}
			_model.rotateSide(orientation,degrees);
		}
		// Отмена хода
		public function undoMove():void{
			if(_history.length<=0){
				_totalUndo=false;
				return;
			}
			_playBack=true;
			var move:Array=_history.pop();
			rotate(move,-move[3]);
			_playBack=false;
		}
		public function undoAll():void{
			_totalUndo=true;
			undoMove();
		}
		
		// Анимация вращения кубиков
		public function onAnimate(t:Number, dt:Number):void {
			if(_view.onAnimate(t,dt)){
				onAnimationComplete();
			}
		}
		
		private function onAnimationComplete():void {
			if(_totalUndo){
				undoMove();
			}
		}
		
	}
}